import numpy as np

x=np.array([[1,2,3,-1]
            ,[4,5,6,5]
            ,[7,7,9,-3]])
# x:需要降维的数据，特征矩阵
#k:保留的维度
def pca(x,k):
    #m:样本个数
    #n:特征个数
    m,n=x.shape
    #去中心化
    #求均值,按列求均值
    miu=np.mean(x,axis=0)
    #去中心化
    x=x-miu
    #求协方差矩阵
    cov_=x.T.dot(x)
    #求协方差矩阵的   特征值和特征向量
    # lmds:特征值矩阵
    # us:特征向量矩阵
    lmds,us=np.linalg.eig(cov_)

    eig_pair=[]
    #对特征值和特征向量绑定
    for i in range(n):
        pair=(lmds[i],us[i])
        eig_pair.append(pair)
    eig_pair.sort(reverse=True)
    u=eig_pair[0][1]
    for i in range(1,k):
        u=np.c_[u,eig_pair[i][1]]

    x_new=cov_.dot(u)
    return x_new

x_new=pca(x,2)
print(x_new)